/*
 * NetRayt
 * Copyright (c) 2007-2008 Maciej Nabozny.
 *
 * NetRayt is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * NetRayt is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with NetRayt; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef _CONN_H
#define _CONN_H

#include <QtCore>
#include <QtNetwork>

const int BUFF_SIZE=1024;
const QString TEMP_DIR="/tmp/";

// Dostępne raytracery
const QString yafray="1";
const QString blender="0";
const QString indigo="0";

// Informacje o komputerze
const QString cpuc="1";
const QString cpuf="1900";
const QString mem="1";

const QString yafray_path="/usr/bin/yafray";
const QString blender_path="";
const QString indigo_path="";

/*
 * Pojedynczy element listy
 */
class argNode {
	public:
		QString name, value;
		argNode *next;
		
		argNode() {
			name="";
			value="";
			next=NULL;
		}
		
		~argNode() {
			if (next != NULL) delete next;
		}
};

class argList {
	private:
		argNode *head;
	public:
		argList() {
			head=new argNode;
		}
		
		void set(const QString name, const QString value);
		QString read(const QString name);
		QString toTag();
};

/*
 * Klasa obsługująca pojedynczego klienta.
 */
class connThread: public QThread {
	Q_OBJECT
	private:
		QTcpSocket *conn;				// wskaźnik na połączenie do klienta
		
		argList parseArgs(QString argStr);		// przetworzenie tagu argumentów na argList
		QString fetchData(argList &dataArg);		// zapisuje dodatkowe dane do pliku txt i zwraca jego nazwe
		QString decodeFile(QString filename);		// odkoduj plik filename z base64. Zwróć nową nazwe pliku
		QString encodeFile(QString filename);		// zakoduj plik filename do base64. Zwróć nową nazwe pliku
	public:
		connThread(QTcpSocket *c = 0);		// KONSTRUKTOR
		~connThread();				// DEKONSTRUKTOR
		void run();				// główna funkcja nowego wątku
		
		void test_encoding();			// test kodowania plików
		static QString randomName();			// zwraca 8 losowych znaków a-z
	private slots:
		void parseData();				// slot odbierający nowe dane od klienta
	public slots:
		void sendResponse(argList dataArg, QString filename = "");
		void sendRequest(argList dataArg, QString filename = "");
	signals:
		void recRequest(argList list, QString dataFile);
		void recResponse(argList list, QString dataFile);
};

#endif
